package top.hesisi.springboot3.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.Optional;

/**
 * 控制器日志切面
 *
 * @author hesisi
 */
@Aspect
@Component
@Slf4j
@Order(10)
public class ControllerLogger implements ControllerPointCut {
    //前置切面，表示进入方法之前执行
    @Before("pointCut()")
    public void before(JoinPoint jp) {
        //拦截的方法信息
        log.debug("控制器切面===>{}", jp.getSignature());
        Object[] args = Optional.ofNullable(jp.getArgs()).orElse(new Object[]{});
        StringBuilder sb = new StringBuilder();
        for (Object arg : args) {
            sb.append(arg.getClass().getName()).append(" ").append(arg).append(",");
        }
        if (!sb.isEmpty()) {
            sb.deleteCharAt(sb.length() - 1);
            log.debug("参数信息: {}", sb);
        }

        //后置切面，表示进入方法之后执行

    }
    @After("pointCut()")
    public void after(JoinPoint jp) {
        log.debug("控制器切面完成===>{}", jp.getSignature());
    }

    //返回结果切面，表示进入方法之后返回结果执行
    @AfterReturning(pointcut = "pointCut()", returning = "result")
    public void afterReturning(JoinPoint jp, Object result) {
        log.debug("控制器切面返回结果===>{}", result);
    }
    //数据结构和算法
    //设计模式
}
